#!/bin/bash
# 人脸识别API服务 - Web服务快捷管理脚本

# 项目根目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# 激活虚拟环境
if [ -d ".venv" ]; then
    source .venv/bin/activate
    echo "✅ 虚拟环境已激活"
else
    echo "⚠️  警告: 未找到虚拟环境 (.venv)"
fi

# 默认端口
PORT=${2:-8001}
PID_FILE="./data/.facereg_${PORT}.pid"
LOG_FILE="./logs/service_${PORT}.log"

# 获取进程ID
get_pid() {
    if [ -f "$PID_FILE" ]; then
        cat "$PID_FILE"
    fi
}

# 检查服务是否运行
is_running() {
    local pid=$(get_pid)
    if [ -z "$pid" ]; then
        return 1
    fi
    if ps -p "$pid" > /dev/null 2>&1; then
        return 0
    else
        # PID文件存在但进程不存在，清理PID文件
        rm -f "$PID_FILE"
        return 1
    fi
}

# 前台启动服务
start_service() {
    if is_running; then
        echo "⚠️  服务已在运行中 (PID: $(get_pid), 端口: $PORT)"
        exit 1
    fi
    
    echo "🚀 启动人脸识别API服务..."
    echo "📍 端口: $PORT"
    echo "📂 日志: $LOG_FILE"
    
    # 直接运行 main.py (前台模式，带自动重载)
    python main.py
}

# 后台启动服务
background_service() {
    if is_running; then
        echo "⚠️  服务已在运行中 (PID: $(get_pid), 端口: $PORT)"
        exit 1
    fi
    
    echo "🚀 后台启动人脸识别API服务..."
    echo "📍 端口: $PORT"
    echo "📂 日志: $LOG_FILE"
    
    # 后台运行并记录PID
    nohup python -c "
from config.settings import settings
import uvicorn

# 修改端口
settings.app_port = $PORT

# 启动服务
uvicorn.run(
    'main:app',
    host=settings.app_host,
    port=$PORT,
    reload=False,
    log_level='info'
)
" > "$LOG_FILE" 2>&1 &
    
    echo $! > "$PID_FILE"
    sleep 2
    
    if is_running; then
        echo "✅ 服务启动成功 (PID: $(get_pid))"
        echo "💡 查看日志: tail -f $LOG_FILE"
    else
        echo "❌ 服务启动失败，请查看日志: $LOG_FILE"
        exit 1
    fi
}

# 停止服务
stop_service() {
    if ! is_running; then
        echo "⚠️  服务未运行 (端口: $PORT)"
        exit 1
    fi
    
    local pid=$(get_pid)
    echo "🛑 停止服务 (PID: $pid)..."
    
    kill "$pid"
    
    # 等待进程结束
    local count=0
    while ps -p "$pid" > /dev/null 2>&1; do
        sleep 1
        count=$((count + 1))
        if [ $count -ge 10 ]; then
            echo "⚠️  进程未响应，强制终止..."
            kill -9 "$pid"
            break
        fi
    done
    
    rm -f "$PID_FILE"
    echo "✅ 服务已停止"
}

# 重启服务
restart_service() {
    echo "🔄 重启服务..."
    if is_running; then
        stop_service
        sleep 2
    fi
    background_service
}

# 查看状态
show_status() {
    echo "📊 人脸识别API服务状态"
    echo "========================"
    
    if is_running; then
        local pid=$(get_pid)
        echo "✅ 服务运行中"
        echo "   PID: $pid"
        echo "   端口: $PORT"
        echo "   日志: $LOG_FILE"
        echo ""
        echo "进程信息:"
        ps -p "$pid" -o pid,ppid,%cpu,%mem,etime,cmd
    else
        echo "❌ 服务未运行 (端口: $PORT)"
    fi
}

# 开发模式启动
dev_mode() {
    if is_running; then
        echo "⚠️  请先停止运行中的服务"
        exit 1
    fi
    
    echo "🔧 开发模式启动 (支持热重载)..."
    echo "📍 端口: $PORT"
    
    # 开发模式: 自动重载
    uvicorn main:app \
        --host 0.0.0.0 \
        --port $PORT \
        --reload \
        --log-level debug
}

# 生产模式启动 (使用Gunicorn)
prod_mode() {
    if is_running; then
        echo "⚠️  服务已在运行中"
        exit 1
    fi
    
    echo "🏭 生产模式启动 (使用Gunicorn)..."
    echo "📍 端口: $PORT"
    
    # 计算worker数量 (CPU核心数 * 2 + 1)
    WORKERS=$(python -c "import os; print(os.cpu_count() * 2 + 1)")
    
    echo "👷 Worker数量: $WORKERS"
    
    gunicorn main:app \
        --bind 0.0.0.0:$PORT \
        --workers $WORKERS \
        --worker-class uvicorn.workers.UvicornWorker \
        --access-logfile "$LOG_FILE" \
        --error-logfile "$LOG_FILE" \
        --pid "$PID_FILE" \
        --daemon
    
    sleep 2
    if is_running; then
        echo "✅ 生产服务启动成功"
    else
        echo "❌ 服务启动失败，请查看日志"
    fi
}

# 主命令处理
case "$1" in
    start)
        start_service
        ;;
    stop)
        stop_service
        ;;
    restart)
        restart_service
        ;;
    status)
        show_status
        ;;
    background|bg)
        background_service
        ;;
    dev)
        dev_mode
        ;;
    prod)
        prod_mode
        ;;
    *)
        echo "📖 人脸识别API服务管理"
        echo ""
        echo "用法: $0 {start|stop|restart|status|background|dev|prod} [端口号]"
        echo ""
        echo "命令说明:"
        echo "  start      - 前台启动服务 (默认端口: 8001)"
        echo "  stop       - 停止服务"
        echo "  restart    - 重启服务"
        echo "  status     - 查看服务状态"
        echo "  background - 后台启动服务"
        echo "  dev        - 开发模式启动 (支持热重载)"
        echo "  prod       - 生产模式启动 (使用Gunicorn)"
        echo ""
        echo "示例:"
        echo "  $0 start           # 前台启动服务 (端口8001)"
        echo "  $0 background      # 后台启动服务 (端口8001)"
        echo "  $0 background 8002 # 后台启动 (端口8002)"
        echo "  $0 dev             # 开发模式 (热重载)"
        echo "  $0 prod            # 生产模式 (Gunicorn)"
        echo "  $0 stop            # 停止服务 (端口8001)"
        echo "  $0 stop 8002       # 停止端口8002的服务"
        echo "  $0 status          # 查看服务状态"
        echo "  $0 restart         # 重启服务"
        echo ""
        echo "💡 提示:"
        echo "  - 开发调试: 使用 'dev' 模式或直接在IDE中运行 main.py"
        echo "  - 生产部署: 使用 'prod' 模式，基于Gunicorn多进程"
        echo "  - 查看日志: tail -f ./logs/service_8001.log"
        exit 1
        ;;
esac
